﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "IFamily3DSketchCurve.h"

namespace gfam
{

    /// \brief 三维草图螺旋线
    class GM_FAMILY_SERVICE_EXPORT IFamily3DSketchSpiralLine : public IFamily3DSketchCurve
    {
        DEFINE_CAST_DERIVED(gfam::IFamily3DSketchSpiralLine, gfam::IFamily3DSketchCurve)
    public:

        /// \brief 根据坐标系、半径、参数范围、顺逆方向、高度系数、半径系数构建螺旋线对象
        /// \param pDoc               对象所处文档
        /// \param sketchId           对象所在草图Id
        /// \param coord              螺旋线坐标系，起点位于XY平面且在X轴上,Z 轴是螺旋线的旋转轴,Z 轴方向是高度增加的方向
        /// \param bottomOffset       螺旋线底部偏移
        /// \param height             螺旋线高度
        /// \param beginRadius        起始半径，必须大于0,由于容差的存在，需要大于 1E-4，否则会被认为半径为0
        /// \param endRadius          终点半径，可以为任意数值，不推荐为负值，此时螺旋线跨越0点边界，会自交，一般没有实用价值
        /// \param numRings           旋转圈数，必须大于0，一圈代表旋转2π
        /// \param antiClockwise      螺线顺逆方向，true：逆时方向， false：顺时方向
        /// \return 三维螺旋线
        static IFamily3DSketchSpiralLine* Create(
            gcmp::IDocument* pDoc,
            const gcmp::ElementId& sketchId,
            const gcmp::Coordinate3d& coord,
            double bottomOffset,
            double height,
            double beginRadius,
            double endRadius,
            int numRings,
            bool antiClockwise
        );

    public:
        /// \brief  获取坐标系
        /// \return 坐标系对象
        virtual gcmp::Coordinate3d GetCoordinate() const = 0;

        /// \brief  获取底部偏移
        /// \return 底部偏移
        virtual double GetBottomOffset() const = 0;

        /// \brief  获取高度
        /// \return 起始半径
        virtual double GetHeight() const = 0;
        
        /// \brief  获取起始半径
        /// \return 起始半径
        virtual double GetBeginRadius() const = 0;
        
        /// \brief  获取终点半径
        /// \return 终点半径
        virtual double GetEndRadius() const = 0;
        
        /// \brief  获取旋转圈数
        /// \return 圈数
        virtual int GetNumRings() const = 0;

        /// \brief  是否逆时针
        /// \return true：逆时， false：顺时
        virtual bool IsAntiClockwise() const = 0;
    };
}